package org.grade.manage;

import org.grade.bean.request.Region.RegionContentRequest;
import org.grade.bean.request.Region.RegionGetContentRequest;
import org.grade.bean.request.Region.RegionImageRequest;
import org.grade.bean.response.RegionContentResponse;
import org.grade.bean.response.RegionResponse;
import org.grade.common.Result;
import org.grade.common.ServiceException;
import org.grade.model.AnswerSheet;
import org.grade.model.Region;
import org.grade.service.IAnswerSheetService;
import org.grade.service.IRegionService;
import org.grade.service.IUserService;
import org.grade.utils.SecurityUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 处理与考试信息和试卷区域相关的请求
 */
@Service
public class ExamInfoManage {
    /**
     * 注入服务
     */
    @Resource
    private IAnswerSheetService answerSheetService;

    @Resource
    private IRegionService regionService;

    @Resource
    private IUserService userService;

    /**
     * 功能：查询指定试卷区域的评分细则内容。
     * 流程：从请求中获取区域ID，通过regionService查询该区域的评分细则内容并返回
     * @param request
     * @return
     */
    public Result queryRegionContent(RegionGetContentRequest request) {
        String regionId = request.getRegionId();
        // 获取评分细则
        String content = regionService.lambdaQuery()
                .eq(Region::getRegionId, regionId)
                .one().getRegionContent();
        return Result.ok(content);
    }

    /**
     * 功能：查询指定答题卡关联的所有试卷区域列表。
     * 流程： a. 从请求中获取试卷ID和用户ID，通过用户ID获取学生编号。
     *       b. 查询数据库中与给定试卷ID和学生编号匹配的答题卡记录。如果没有找到相关记录，则抛出异常。
     *       c. 获取答题卡的sheetId，然后查询所有与该sheetId关联的试卷区域。
     *       d. 将查询到的区域信息转换为RegionResponse对象并收集它们，最后返回这些对象组成的列表
     * @param request
     * @return
     */
    public Result queryRegionList(RegionImageRequest request) {
        // 前置准备
        String paperId = request.getPaperId();//试卷id
        String userId = SecurityUtil
                .getUserFromHolder().getUserId();//用户id
        String studentNumber = userService.getStudentNumber(userId);//获取学生编号
        // 查询数据库，获取sheetId
        AnswerSheet one = answerSheetService.lambdaQuery()
                .eq(AnswerSheet::getPaperId, paperId)
                .eq(AnswerSheet::getStudentNumber, studentNumber)
                .one();
        if (Objects.isNull(one)) {
            throw new ServiceException("该试卷尚未打分");
        }
        String sheetId = one.getSheetId();//答题卡id

        List<RegionResponse> collect = regionService.lambdaQuery()
                .eq(Region::getSheetId, sheetId).list()
                .stream()
                .map(region -> new RegionResponse(region.getRegionId(), region.getIsGraded(), region.getRegionImage()))
                .collect(Collectors.toList());

        return Result.ok(collect);
    }

    /**
     * 功能：查询指定试卷区域的评分细则内容和分数。
     * 流程：从请求中获取区域ID，通过regionService查询该区域的评分细则内容和分数，然后将这些信息构建成一个RegionContentResponse对象并返回
     * @param request
     * @return
     */
    public Result queryContentAndScore(RegionContentRequest request) {
        String regionId = request.getRegionId();//获取区域ID

        Region one = regionService.lambdaQuery()
                .eq(Region::getRegionId, regionId)
                .one();//区域
        RegionContentResponse build = RegionContentResponse.builder()
                .score(one.getRegionScore())
                .content(one.getRegionContent())
                .build();//区域内容和分数
        return Result.ok(build);
    }
}
